<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>数组去重</title>
</head>

<body>
  <script>
    let arr = [1, 1, 2, 7, 8, 9, 8, 7, 10, 10, 11, 12, 13, 8, 1]
    // 一、双for循环
    //1 function deduplication(arr) {
    //   if(!(arr instanceof Array) ){
    //     console.error('请传入数组')
    //   }
    //   for (let i = 0; i <  arr.length-1; i++) {
    //     for (let j = i+1; j <  arr.length; j++) {
    //       if (arr[i] === arr[j]) {
    //         // 如果相等,则用最后一项替换当前项
    //         arr[j] = arr[arr.length - 1];
    //         // 总长度减一
    //         arr.length--;
    //         // 因为当前值替换成新数值,所以重新判断
    //         j--;
    //       }
    //     }
    //   }
    // } 
    // 第二种 双for循环判断方法
    // 2 function deduplication(arr) {
    //   if (!(arr instanceof Array)) {
    //     console.error('请传入数组')
    //   }
    //   // 创建新数组，用于存放去重后的数组
    //   const res=[arr[0]]
    //   for (let i = 1; i < arr.length; i++) {
    //     for (var j=0; j < res.length; j++) {
    //       if (arr[i] === res[j]) {
    //         break;
    //       }
    //     }
    //     // 如果j等于res.length说明arr[i]是唯一的
    //     if(j==res.length){
    //       res.push(arr[i])
    //     }
    //   }
    //   return res;
    // }


    // 对象键值方式去重
    // function deduplication(arr) {
    //   const obj={};
    //   for ( let i=0;i<arr.length;i++) {
    //     let item = arr[i];
    //     // 判断是否有此属性,如果有则说明数组重复
    //     if(obj[item]!=undefined){
    //       arr[i]=arr[arr.length-1]
    //       arr.length--;
    //       i--;
    //     }else{
    //       obj[item]=item
    //     }
    //   }
    // }
    // 优化对象键值方式去重
    // function deduplication(arr) {
    // const obj={};
    // return   arr.filter((item)=>{
    //   // typeof item + item用于判断1 和 '1' 情况,JSON.string用于判断数组中值为对象的情况
    //   return obj.hasOwnProperty(typeof item + JSON.stringify(item))?false:obj[typeof item + JSON.stringify(item)]=true;
    // })
    // }

    // indexOf
    // function deduplication(arr) {
    //   const res=[arr[0]]
    //   for (let i = 1; i < arr.length; i++) {
    //     if(res.indexOf(arr[i])==-1){
    //       res.push(arr[i])
    //     }
    //   }
    //   return res;
    // }
    // // es5 filter 优化 indexOf
    //  function deduplication(arr) {
    //   return arr.filter((item,index)=>arr.indexOf(item)===index);
    // }

    //es6 set
    // function deduplication(arr) {
    //   return [... new Set(arr)];
    // }

    // es6 Map  利用Map特性优化对象键值去重方式
    function deduplication(arr) {
      const obj = new Map();
      return arr.filter((item) =>
        obj.has(item) ? false : obj.set(item, true)
      )
    }


    deduplication(arr)
  </script>
</body>

</html>